import ddddocr
import base64
import requests
import jsonpath
import os

# 获取验证码的接口
def get_auth_captcha():
    payload = {
        "method": "get",
        "url": "http://192.168.10.142/api/cloud-api" + "/auth/captcha"
    }
    response = requests.request(**payload).json()
    sn = jsonpath.jsonpath(response, "$..sn")[0]
    image = jsonpath.jsonpath(response, "$..image")[0]  # 这个[0]是因为jsonpath返回的数据储存在列表里
    return sn, image


# 生成验证码文本的方法
def dddd_ocr_text(image):

    # 步骤1.分割image，得到头部和Base64编码的部分
    encode_data = image.split(",")[1]

    # 步骤2.解码Base64元数据
    decode_data = base64.b64decode(encode_data)

    # 步骤3.通过ddddocr来识别图片元数据
    ocr = ddddocr.DdddOcr()     # 实例化
    text = ocr.classification(decode_data)
    return text


# 存放全局的sn文本和验证码文本
sn_captcha_text = {}

# get_res_sn_captcha()函数的执行次数
run_nums = 0


# 获取sn和验证码的最终方法
def get_res_sn_captcha():

    # 如果是生产环境，按照以下逻辑走：
    if os.environ["ENV"] == "prod":
        global run_nums  # global用于在函数内引用函数外的不可变变量（可变变量可以直接通过引用传递）

        # 第一次和判断失败重跑时执行的逻辑（第一次sn_captcha_text字典为空，所以执行以下代码；第二次执行时，sn_captcha_text不为空，且run_nums为1，所以不执行以下代码；后面失败重试是因为run_nums变成了2/4/6等。
        if not sn_captcha_text or run_nums % 2 == 0:  # ==是赋值运算符，表示“如果某条件成立，则结果为真”；=是赋值运算符，只在赋值时运用。
            sn, image = get_auth_captcha()
            captcha = dddd_ocr_text(image)
            sn_captcha_text["sn"] = sn
            sn_captcha_text["captcha"] = captcha

        run_nums += 1  # 注意写在return前面，return后面的代码不执行。

        return sn_captcha_text

    # 如果是测试环境，按照以下逻辑走：
    elif os.environ["ENV"] == "test":
        sn = get_auth_captcha()[0]
        sn_captcha_text["sn"] = sn
        sn_captcha_text["captcha"] = "aaaa"  # 测试环境的验证码一般是固定的，直接写在这里就行。
        return sn_captcha_text


# 下面是用于调试的，不用管
# if __name__ == '__main__':
#     image = ""
#     text = dddd_ocr_text(image)
#     print(text)





